package cn.hqc.basic.aop;


import cn.hqc.basic.anno.LogAnno;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;

import java.lang.reflect.Method;

//表明当前类为切面类
@Aspect
//将当前类放到Spring容器中
@Component
public class LogAop {

    // 切的是我们的自定义注解
    @Pointcut("@annotation(cn.hqc.basic.anno.LogAnno)")
    private void pointcut() {

    }

    /**
     * 以后aop 三个东西：aop+自定义注解+反射
     * @param pjp
     * @return
     * @throws Throwable
     */
    @Around("pointcut()")
    private Object aroundController(ProceedingJoinPoint pjp) throws Throwable {
        /**
         * 获取到方法的请求
         * 获取到ip  百度有的是
         * 记录方法执行时间
         */
        MethodSignature signature = (MethodSignature) pjp.getSignature();
        Method method = signature.getMethod();
        LogAnno annotation = method.getAnnotation(LogAnno.class);
        String name = annotation.name();
//        pjp.getArgs()// 参数
        System.out.println(signature);

        // 执行我们自己的业务方法
        // 方法执行之前
        Object proceed = pjp.proceed();
        // 方法执行之后

        // 保存到数据库

        return proceed;

    }
}
